/*
 * Motor.cpp
 *
 *  Created on: 06/10/2013
 *      Author: juliansci
 */

#include "Motor.h"
#include <iostream>
#include "../modelo/UnidadLogica.h"
#include "../modelo/Engranaje.h"

Motor::Motor(double x, double y, double ancho, double alto, string pathImagen): Elemento(x, y, ancho, alto, pathImagen) {
	this->posEngranajeX = ancho;
	this->posEngranajeY = alto/5;
	this->engranaje=NULL;
	this->rotaADerecha = true;
	this->tiempoSentidoRotacion = 0;
	this->estadoMotor = false;
	this->funcinando = false;
}

Motor::~Motor() {
	// TODO Auto-generated destructor stub
}

bool Motor::aceptaEngranaje(){
	if(this->engranaje != NULL) return false;
	return true;
}

void Motor::agregarEngranaje(Elemento* eng){
	Engranaje* engranaje = (Engranaje*) eng;
	engranaje->setX(this->getX() + this->posEngranajeX);
	engranaje->setY(this->getY() + this->posEngranajeY);
	engranaje->actualizarPosicionCorrea();
	this->engranaje = engranaje;
}


void Motor::mover(double centroX,double centroY){
	Elemento::mover(centroX,centroY);
	if(this->engranaje != NULL){
		Engranaje* engranajeActual = (Engranaje*) this->engranaje;
		engranajeActual->setX(this->getX() + this->posEngranajeX);
		engranajeActual->setY(this->getY() + this->posEngranajeY);
		engranajeActual->actualizarPosicionCorrea();
	}
}

void Motor::dibujar(double x, double y, double ancho, double alto,	SDL_Renderer* renderer){
	Elemento::dibujar(x,y,ancho,alto,renderer);

	UnidadLogica* unidadLogica = UnidadLogica::obtenerInstancia();
	pair<double,double> parPuntosXY = unidadLogica->convertirULAPixel(this->getX(),this->getY());
	pair<double,double> parPuntosAnchoAlto = unidadLogica->convertirULAPixel(this->getAncho(),this->getAlto());

	if(((SDL_GetTicks() - this->tiempoSentidoRotacion) < 4000) && this->tiempoSentidoRotacion >0){
		SDL_Texture* tex = NULL;

		if (this->rotaADerecha == true) {
			tex = IMG_LoadTexture(renderer, "img/flecha_rotacion_derecha.png");
		} else {
			tex = IMG_LoadTexture(renderer, "img/flecha_rotacion_izquierda.png");
		}

		SDL_Rect sdlRect;
		sdlRect.x = parPuntosXY.first + parPuntosAnchoAlto.first * PROPORCION_FLECHA_SENTIDO_ROTACION_X ;
		sdlRect.y = parPuntosXY.second + parPuntosAnchoAlto.second * PROPORCION_FLECHA_SENTIDO_ROTACION_Y;
		sdlRect.w = parPuntosAnchoAlto.first * PROPORCION_FLECHA_SENTIDO_ROTACION_ANCHO ;
		sdlRect.h = parPuntosAnchoAlto.second * PROPORCION_FLECHA_SENTIDO_ROTACION_ALTO;

		SDL_RenderCopy(renderer, tex, NULL, &sdlRect);
	} else {
		tiempoSentidoRotacion = 0;
	}

}


void Motor::eliminarEngranaje(){
	this->engranaje=NULL;
}

void Motor::rotar(double angulo){
	// No hago nada
}

Elemento* Motor::obtenerEngranaje() {
	return this->engranaje;
}

void Motor::jointearElemento(b2World* world){
	if (this->obtenerEngranaje()){
		EntidadFisica* engranaje = this->obtenerEngranaje()->getEntidadFisica();
		EntidadFisica* motorFisica = this->getEntidadFisica();
		motorFisica->setearElementosAJointear(engranaje, NULL);
		motorFisica->jointear(world);
	}
}

void Motor::eliminarReferencias(list<Elemento*>* elementosCanvas){
	cout << "Voy a eliminar las referencias al motor" << endl;
		if (this->engranaje) {
			cout << "Entro al IF del motor" << endl;
			elementosCanvas->remove(this->engranaje);
			this->engranaje->eliminarReferencias(elementosCanvas);
			cout << "Elimine las referencias dentro del engranaje" << endl;
			delete this->engranaje;
			this->engranaje=NULL;
		}
}
bool Motor::sinReferencias(){
	if(this->engranaje == NULL) return true;
	return false;
}


void Motor::actualizarSonido(){
//	if (!this->estadoMotor && this->obtenerEngranaje() !=NULL){
//			this->estadoMotor = true;
//	}
//	if ((this->estadoMotor) && (this->obtenerEngranaje()) && (!this->funcinando)){
//		Sonido* sonidoMotor= new Sonido();
//		sonidoMotor->cargarSonido("sounds/motor.wav");
//		sonidoMotor->reproducirSonidoRepetidamente();
//		this->funcinando = true;
//	}
}

bool Motor::esBasico(){
	return false;
}




